最后更新时间:2019年6月17日
功能介绍
地图显示是GIS应用中最基础的功能,基本上所有的GIS功能都是以地图为基础,或以地图为媒介来展示功能的。MapGIS Mobile采用高性能地图渲染引擎,充分利用GPU的加速能力,结合各种调度机制和缓存策略,使得地图能够快速浏览展示。
全面支持MapGIS地图显示(二维、三维),包括移动端离线地图、IGS在线地图服务(含OGC服务)。这里介绍常见的MapGIS二维地图显示,包括离在线的地图文档显示、瓦片地图显示、矢量图层显示。 MapGIS地图显示功能在移动GIS中非常关键,尤其是离线地图的支持,提供离线地图与在线地图的同步机制。地图显示是GIS开发的基础,借助于MapGIS平台进行地图显示,为用户提供了方便快捷的移动地图显示方式。
支持对第三方地图服务的显示,比如天地图、百度地图、高德地图、OSM地图、Google地图、其他的地图服务,可提供给人们更多的选择。 第三方地图服务在移动GIS中扮演着举足轻重的作用。比如:在国内使用地图时,使用天地图、百度地图显示的地标、道路等信息显示的更加详细,当您在国外旅游时,使用Google地图等地图服务显示的信息会更加详细。
除此之外,支持自定义地图服务扩展,可在地图视图中加载自定义切片规则的地图数据,可对接各种矢量、瓦片地图数据或服务,具备良好的扩展性。
开发者可通过该功能,实现移动端加载离线矢量地图。移动端离线矢量地图,须通过移动转换工具将桌面端组织制作的地图文档转换为移动端离线数据包,并拷贝到移动设备才能使用。
开发者可通过该功能,实现移动端加载离线瓦片地图。瓦片地图是指将一定范围内的地图按照一定的尺寸和格式,按缩放级别或者比例尺,切成若干行和列的正方形栅格图片,对切片后的正方形栅格图片被形象的称为瓦片(Tile)。离线瓦片地图加载,须将裁剪后的瓦片数据拷贝到移动端设备。
开发者可通过该功能,实现移动端加载在线矢量地图。移动端在线矢量地图加载,须提供可用的在线矢量地图服务,可通过MapGIS IGServer发布矢量地图服务或OGC服务。
开发者可通过该功能,实现移动端加载在线瓦片地图。瓦片地图是指将一定范围内的地图按照一定的尺寸和格式,按缩放级别或者比例尺,切成若干行和列的正方形栅格图片,对切片后的正方形栅格图片被形象的称为瓦片(Tile)。移动端在线瓦片地图加载,须提供可用的在线瓦片地图服务,可通过MapGIS IGServer发布瓦片地图服务或OGC服务。
开发者可通过该功能,实现移动端加载OGC服务的WMS地图,须提供可用的WMS服务,可通过MapGIS IGServer发布WMS或者调用其他第三方的WMS服务。
开发者可通过该功能,实现移动端加载OGC服务的WMTS地图,须提供可用的WMTS服务,可通过MapGIS IGServer发布WMTS或者调用其他第三方的WMTS服务。
开发者可通过该功能,实现移动端加载第三方地图,如天地图、百度地图、高德地图、OSM地图、Google地图等,须确保网络能正常使用且第三方地图服务可用。
开发者可通过该功能,实现移动端加载自定义的地图,即自定义切片规则的地图数据。
开发者可通过该功能,实现移动端加载3D灰度模型,其矢量数据必须通过桌面工具进行3D灰度模型的预处理设置。
基本原理
移动端地图显示与MapGIS桌面软件地图显示设计一脉相承,均通过地图文档—地图—图层来组织地图,支持离线模式与在线模式的地图加载。其显示的基本原理也与桌面端、Web端类似,采用一个地图视图控件作为地图容器装载地图,调用地图容器(com.zondy.mapgis.android.mapview.MapView)的相关接口即可加载移动二维地图。
功能接口
MapGIS Mobile for Android SDK提供了多个接口来实现地图加载功能,都由com.zondy.mapgis.android.mapview程序包中的MapView类提供,例如loadFromFile、loadFromDocument、setMap等方法。核心接口如下:
方法 | 接口 | 适用类型 |
---|---|---|
加载地图文档 | loadFromFile / loadFromFileAsync | 离线、在线地图 |
加载地图文档对应索引的地图 | loadFromDocument / loadFromDocumentAsync | 离线、在线地图 |
基于ServerLayer实例化Map | setMap / setMapAsync | 离线瓦片、在线地图 |
可以观察到,每一类方法都包括同步和异步的接口,它们具有不同的应用场景:
同步方法:同步方法一般用于加载小数据量的离线地图,在主线程中加载地图数据,对于数据量大的离线数据则可用异步方法;
异步方法:异步方法一般用于加载数据量大的离线地图或者在线地图,通过子线程加载地图数据,提高显示效率。例如当离线地图图层数目较多,或者加载在线服务图层的时候,地图加载较慢,此时不能把地图加载放到主线程,而需要在子线程加载地图。
说明:除直接调用API接口中的异步方法,可以单独开一个子线程使用同步方法加载地图。
基本流程
1
如果要使用离线地图:需先进行数据转换操作,然后再将生成的移动数据包拷贝到移动设备中。
如果要使用在线地图:首先要发布自己的服务并获取服务地址,或者获取已有的服务地址,然后再组织、配置数据。
具体的操作可参考数据组织配置->地图数据组织模块。
2
以Android Studio软件作为开发工具,打开软件后新建项目。
APP应用通常需要使用存储卡、网络、相机、定位等资源,因此还需要为应用添加移动终端设备资源的使用权限。根据应用的实际需求添加对应的应用程序权限。实现地图显示功能,需要进行MapGIS环境初始化、授权操作,加载离线或者在线地图,所以需要应用具备读/写手机存储的权限、联网权限、读取手机状态的权限。在“AndroidManifest.xml”程序清单文件中编写对应权限标签。
<!-- 允许应用程序向外部存储写入数据 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 允许应用程序读取外部存储数据 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- 允许对移动存储安装和卸载文件系统 --> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <!-- 允许应用程序只读访问手机状态 --> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!-- 允许应用程序访问网络,可能产生GPRS流量 --> <uses-permission android:name="android.permission.INTERNET" />
说明:在应用程序的targetSdkVersion版本大于等于23,手机的Android系统版本大于等于6.0时,对于读写手机存储、读取手机状态等危险权限,需要在Java代码中通过代码来动态申请权限。
3
从云生态圈的开发世界中获取MapGIS Mobile for Android二次开发包,其中libs文件夹中的文件就是实现MapGIS移动GIS功能需要的具体开发库,包括jar包和so库两部分,使用时需将其引入到项目中。
(1) 导入jar包:切换工程目录结构为“Project”模式,将jar包拷贝到工程的“app\libs”目录下。
添加完成之后,选择加入的jar包,右键单击,在弹出的菜单中选择“Add As Library”,弹出“Create Library”对话框,选择app模块,点击“OK”即可。等待项目同步更新完成,查看当前module中的“build.gradle”脚本文件,发现其中在dependencies标签中增加了jar的依赖,到此完成jar的导入。
(2) 导入so库:首先同样将SDK中libs目录下的armeabi和armeabi-v7a文件夹拷贝到模块的libs目录下,如果已有armeabi和armeabi-v7a目录,则直接将*.so库文件复制到对应的目录中。
然后打开对应module下的build.gradle脚本文件,在android标签中,添加如下代码,完成后sync同步工程即可。
sourceSets { main { jniLibs.srcDirs = ['libs']; } }
4
要使用MapGIS移动平台提供的功能,导入开发库后,还需要初始化MapGIS环境、请求移动端授权,这样GIS功能才能得以使用。移动开发授权功能对应的API程序包为com.zondy.mapgis.android.environment,使用环境类(Environment)的接口方法实现。
在工程中展开src的目录,打开MainActivity.java文件,先获取移动设备SD卡上放置地图数据文件的路径,然后调用Environment的initialize()进行环境初始化,调用requestAuthorization()请求授权。使用MapGIS Mobile提供的功能接口之前,首先必须进行环境初始化和授权验证。
initialize(java.lang.String strRootPath, Context context) 环境初始化,必须在使用SDK各组件之前调用,会自动建立根目录结构 requestAuthorization(Context context,Environment.AuthorizeCallback callback) 请求授权
说明:调用initialize()进行环境初始化,必须在使用SDK各组件之前调用,会自动建立根目录结构。
核心代码如下:
//环境目录路径 String strRootPath = android.os.Environment.getExternalStorageDirectory().getPath() + "/MapGIS Mobile 2D Sample/"; //环境初始化,必须在使用SDK各组件之前调用,会自动建立根目录结构 Environment.initialize(strRootPath, getApplicationContext()); //请求授权 Environment.requestAuthorization(this, new Environment.AuthorizeCallback() { @Override public void onComplete() { System.out.println("授权完成"); } });
5
在布局中加载一个地图控件(MapView),然后在其活动的Java源文件(如MainActivity.java)中编码调用接口,实现地图显示功能。
(1)页面布局(如res/layout/activity_main.xml)——加载地图控件
在工程中展开res/layout目录,打开activitymain.xml文件,初始化加载一个MapView视图(com.zondy.mapgis.android.mapview.MapView)并设置其ID,即在activitymain.xml文件中新增加载MapView视图的代码。
<com.zondy.mapgis.android.mapview.MapView android:id="@+id/mapView" android:layout_width="match_parent" android:layout_height="match_parent"> </com.zondy.mapgis.android.mapview.MapView>
(2)代码编写(如src下的MainActivity.java文件)——地图控件中加载地图数据
打开工程中的src下MainActivity.java文件,先获取移动设备SD卡上放置地图数据文件的路径,进行环境初始化,然后调用云授权认证的接口,在其回调中通过地图视图对象调用loadFromFile接口加载离线地图。
//引用开发库中对应类 import com.zondy.mapgis.android.mapview.MapView; //通过ID获取地图视图对象 mMapView = (MapView) findViewById(R.id.mapView); //加载地图文档(同步方法) long s = mMapView.loadFromFile(MainActivity.rootPath+"/MapGIS/map/WuHan/WuHan.mapx");
6
单击菜单栏上的Run|Run ‘app’,或者工具栏上的 图标,在弹出的对话框中选择目标设备(模拟器或者真机),单击“OK”按钮,即可将项目安装到移动设备上。
将项目安装到模拟器或者手机上,并运行。若初次运行基于MapGIS Mobile 10.3开发的app,将在app中弹出对话框进行授权认证,许可认证后的移动端设备再次运行使用此app则不会再弹框认证。
在外部模拟器(Droid4X)运行app,确保地图数据已经拷贝到模拟器的SD卡目录下,初次运行时弹出对话框进行授权认证,许可认证成功后进入地图显示界面。
在手机上运行app,确保地图数据已经拷贝到手机的SD卡目录下,初次运行时弹出对话框进行授权认证,许可认证成功后进入地图显示界面。